package wikipedia
{
	import modelos.Diccionario;
	import modelos.Utiles;
	

	public class WikiPage
	{
		//================================================================================
		var xml : XML;
		var contenido : WikiContenido;
		//================================================================================
		
		//--------------------------------------------------------------------------------
		public function WikiPage(data : String)
		{
			ProcesarInfo(data);
		}

		//================================================================================
		//PROPIEDADES
		//================================================================================

		//--------------------------------------------------------------------------------
		public function get Contenido() : WikiContenido
		{
			return this.contenido;
		}

		//================================================================================
		//ACCIONES
		//================================================================================

		//--------------------------------------------------------------------------------
		private function ProcesarInfo(data : String)
		{
			xml = ParsearHTML(data);
			var secciones = ParsearSecciones(xml.page.title, xml.page.revision.text);
		}

		//--------------------------------------------------------------------------------
		private function ParsearHTML(data : String)
		{
			var data_modificado : String = data;

			data_modificado = data_modificado
				.replace(/<!.*?>/g, "") //eliminar tags especiales
				.replace(/<mediawiki\s*\w*\s*xmlns.*?>/, "<mediawiki>"); //quitar atributos xmlns

			return CrearXML(data_modificado);
		}
		
		//--------------------------------------------------------------------------------
		private function ParsearSecciones(titulo_inicial : String, texto : String)
		{
			var id : int = 1;
			
			var texto_modificado : String = texto;
			
			//sanear texto
			texto_modificado = texto_modificado
				.replace(/["]/g, "&quot;") 
				.replace(/[<]/g, "&lt;")
				.replace(/[>]/g, "&gt;"); 
			
			//detectar header principal
			texto_modificado = Utiles.StringFormat("<xml><h id=\"{0}\" nivel=\"{1}\" titulo=\"{2}\" texto=\"{3}\"></h></xml>", id++, 1, titulo_inicial, texto_modificado);

			//detectar headers restantes
			texto_modificado = texto_modificado.replace(
				REConSeparadores("=","=",true),
				function(...args)
				{
					var nivel : String = args[1].length;
					var titulo : String = args[2];
					return Utiles.StringFormat("\"></h><h id=\"{0}\" nivel=\"{1}\" titulo=\"{2}\" texto=\"", id++, nivel, titulo);
				}
			);

			var xml_secciones : XML = CrearXML(texto_modificado);
			
			return [];
		}

		//--------------------------------------------------------------------------------
		private function CrearXML(data : String)
		{
			var _xml : XML = new XML(data);
			Utiles.Assert(_xml,"XML nulo");
			return _xml;
		}

		//--------------------------------------------------------------------------------
		private function REConSeparadores(abre:String,cierra:String,ini_linea:Boolean=false):RegExp
		{
			return new RegExp(Utiles.StringFormat("{0}({1}+)([^{2}]+)({2}+)", (ini_linea?"\n":""), abre, cierra), "g");
		}

//		//================================================================================
//		
//		//--------------------------------------------------------------------------------
//		private function FormatearXML(data : String)
//		{
//			var data_ok = data;
//			data_ok = data_ok.replace(/<!DOCTYPE(.)+>/, "");
//			data_ok = data_ok.replace(/xmlns/,"_xmlns"); 
//			
//			return data_ok;
//		}
//
//		//--------------------------------------------------------------------------------
//		private function ParsearXMLviejo()
//		{
//			contenido = new WikiContenido();
//
//			var titulo : String = this.xml.page.title;
//			var texto : String = this.xml.page.revision.text;
//			var lineas : Array = texto.split('\n');
//			
//			var nivel_wiki : int = 1;
//			var niveles : Array = [];
//			var texto_acumulado : String = "";
//			var links : Diccionario = new Diccionario();
//			var refs : Diccionario = new Diccionario();
//			
//			for each (var linea : String in lineas)
//			{
//				var match : Array = REConSeparadores("=","=",true).exec(linea);
//				if (match)
//				{
//					contenido.AsignarValor(niveles, titulo, texto_acumulado, links, refs, new Diccionario());
//					
//					var nivel_wiki_nuevo : int = match[1].length;
//					
//					if (nivel_wiki < nivel_wiki_nuevo) {  niveles.push(0); }
//					else if (nivel_wiki > nivel_wiki_nuevo) { while (niveles.length > nivel_wiki_nuevo-1) niveles.pop(); }
//					niveles[niveles.length-1]++;
//					
//					nivel_wiki = nivel_wiki_nuevo;
//					titulo = match[2];
//					texto_acumulado = "";
//					links = new Diccionario();
//					refs = new Diccionario();
//				}
//				else
//				{
//					linea = linea.replace(/\{\{=\}\}/g, "<EQUAL/>");
//					
//					linea = linea.replace(REConSeparadores("\\[","\\]"), function(...args)
//					{
//						var id = links.Longitud+1;
//						links.Definir(id,args[2]);
//						return Utiles.StringFormat("<LINK={0}>", id);
//					}
//					);
//					
//					//					linea = linea.replace(REConSeparadores("\\{","\\}"), function(...args)
//					//					{
//					//						var id = refs.Longitud+1;
//					//						refs.Definir(id,args[2]);
//					//						return Utiles.StringFormat("<REF={0}>", id);
//					//					}
//					//					);
//					
//					texto_acumulado += linea;
//					
//					
//				}
//			}
//			
//			contenido.AsignarValor(niveles, titulo, texto_acumulado, links, refs, new Diccionario());
//		}
//		
//		//--------------------------------------------------------------------------------
//		private function REConSeparadores(abre:String,cierra:String,fin_linea:Boolean=false):RegExp
//		{
//			return new RegExp(Utiles.StringFormat("({0}+)([^{1}]+)({1}+)"+(fin_linea?"$":""), abre, cierra), "g");
//		}

	}
}